/**
 * @file   Executable.java
 * @author Enrique Madrid <emadridm@gmail.com>
 * @date   Mon Jul 16 23:39:21 2007
 * 
 * @brief  Interfaz Executable
 * 
 */

package com.myt.matp.core;

/**
 * @brief Interface Executable.
 *
 * La Interfaz Executable es implementada por la clase Module para que las instancias
 * de dicha clase puedan ejecutar procedientos en segundo plano.
 *
 * @author Enrique J. Madrid M.
 * @version %I%, %I%
 * @since 1.0
 * @see Module
 * @see Actions
 * @see Worker
 * @see MATlet
 */
public interface Executable {

    public static final int NONE = 0;
    public static final int EXEC = 1;
    public static final int QUIT = 2;
    public static final int WORK = 3;

    public static final int STATE_INIT = 0;	// The module is execute another module
    public static final int STATE_BACK = 1;	// The module is execute because before module fail.
    public static final int STATE_NEXT = 2;	// The module is execute before before module sucesses
    public static final int STATE_USER = 3;

    /** 
     * @brief Método ejecutado en segundo plano.
     *
     * @param msg Parametros pasados por el ejecutor de módulos del framework (Worker). La función
     *            msg.getWParam() devuelve el estado en que se ejecuta el módulo. Estos valores
     *            pueden ser:
     *
     *            Executable.STATE_INIT : Si el módulo se ejecuta por demanda. Un módulo se ejecuta
     *                                    por demanda al llamar a la función Module.exec().
     *            Executable.STATE_BACK : Si el módulo es extraido del administrador de acciones
     *                                    para ser ejecutado en respuesta a una notificación de
     *                                    fracaso del módulo que estuvo ejecutandose. Un módulo
     *                                    notifica fracaso al llamar a la función Module.execBack().
     *            Executable.STATE_NEXT : Si el módulo es extraido del administrador de acciones
     *                                    para ser ejecutado en respuesta a una notificación de
     *                                    éxito del módulo que estuvo ejecutandose. Un módulo
     *                                    notifica éxito al llamar a la función Module.execNext().
     */
    public void work(final Msg msg);
}
